home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 2
/
Amiga Tools 2.iso
/
tools
/
packer
/
unpacker
/
unpacker.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-09
|
7KB
|
318 lines
////
// UnPacker.c v1.2, 1993-09-22
// Utility for extracting archives from the WB.
//
// This code is Copyright © 1993 Erik Sagalara.
// I supplied it as an example of programming
// Appicons, Tooltypes and other V37+ stuff.
//
// You should be able to compile it easily with
// SASC, and with some tweaking with GCC.
///
#include <intuition/intuition.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <clib/intuition_protos.h>
#include <clib/icon_protos.h>
#include <clib/wb_protos.h>
#include <clib/dos_protos.h>
#include <string.h>
#include <stdio.h>
#ifdef LATTICE
int CXBRK(void) { return (0); }
int chkabort(void) { return (0); }
#endif
struct IntuitionBase* IntuitionBase;
struct DosBase* DosBase;
struct Library* WorkbenchBase;
struct Library* IconBase;
// Global variables
BPTR OldDir=NULL, DestDir=NULL;
UBYTE* version = "$VER: UnPacker 1.2; 93-09-22";
UBYTE* OK = "OK!";
UBYTE *alertMsg =
"\x00\x90\x14" "UnPacker requires AmigaDos 2.04 or higher!" "\x00\x01"
"\x00\x20\x26" "Left=OK!" "\x00\x01"
"\x02\x15\x26" "Right=OK!" "\x00";
struct MsgPort* myport=NULL;
struct AppIcon* appicon=NULL;
char* SuffixList[32];
char* MethodList[32];
UBYTE NumItems=0;
// Local protos
void handletool (char*, char*, char*);
void handlefile (BPTR, char*);
int easyreq (char*, char*, char*, char*);
void cleanexit (char*, int);
////
// Main
////
void main (int argc, char **argv)
{
struct DiskObject* diskobj;
struct AppMessage* appmsg;
struct WBStartup* argmsg;
struct WBArg* wbarg;
char tlab[80], tval[80];
UBYTE i, j;
BOOL ok=TRUE;
if (!(IntuitionBase = (struct IntuitionBase*) OpenLibrary("intuition.library", 0)))
cleanexit ("", 20);
if (!(DosBase = (struct Library*) OpenLibrary("dos.library", 37)))
cleanexit ("", 20);
if (!(WorkbenchBase = (struct Library*) OpenLibrary("workbench.library", 37)))
cleanexit ("", 20);
if (!(IconBase = (struct Library*) OpenLibrary("icon.library", 37)))
cleanexit ("", 20);
// CLI Startup if argc>0
if (argc)
cleanexit ("This program must be started\nfrom the workbench!", 10);
// Otherwise wb startup
argmsg = (struct WBStartup*) argv;
wbarg = argmsg->sm_ArgList;
if (wbarg->wa_Lock) {
OldDir = CurrentDir (wbarg->wa_Lock);
diskobj = GetDiskObject (wbarg->wa_Name);
}
else cleanexit ("Can't access the program icon!\n", 10);
diskobj->do_Type = NULL;
diskobj->do_CurrentX = -2147483648L;
diskobj->do_CurrentY = -2147483648L;
for (i=0; diskobj->do_ToolTypes[i] != NULL; i++) {
handletool (diskobj->do_ToolTypes[i], tlab, tval);
if (strlen (tlab) > 0) {
char* errstr="Error in tooltype entry: ";
j = strlen (tval);
if (strcmp (tlab, "XPOS") == 0) {
if (j > 0)
diskobj->do_CurrentX = atol (tval);
else
easyreq (errstr, diskobj->do_ToolTypes[i], OK, OK);
}
else if (strcmp (tlab, "YPOS") == 0) {
if (j > 0)
diskobj->do_CurrentY = atol (tval);
else
easyreq (errstr, diskobj->do_ToolTypes[i], OK, OK);
}
else if (strcmp (tlab, "DESTDIR") == 0) {
if (j > 0) {
if (NULL == (DestDir = Lock (tval, ACCESS_READ)))
cleanexit ("Can't lock to dest dir!", 10);
}
else
easyreq (errstr, diskobj->do_ToolTypes[i], OK, OK);
}
else if (strlen (tlab) <= 3) {
if (j > 0 && NumItems < 32) {
SuffixList[NumItems] = strdup (tlab);
MethodList[NumItems] = strdup (tval);
NumItems++;
}
else easyreq (errstr, diskobj->do_ToolTypes[i], OK, OK);
}
}
}
// ToolManager startup
if (argmsg->sm_NumArgs > 1) {
for (i=1; i<argmsg->sm_NumArgs; i++)
handlefile (argmsg->sm_ArgList[i].wa_Lock, argmsg->sm_ArgList[i].wa_Name);
cleanexit ("", 0);
}
// Otherwise use appicon
if (!(myport = (struct MsgPort *) CreateMsgPort ()))
cleanexit ("Can't create message port!", 10);
if (!(appicon = AddAppIconA (0L, 0L, "UnPacker", myport, NULL, diskobj, NULL)))
cleanexit ("Can't create appicon!", 10);
while (ok) {
WaitPort (myport);
while (appmsg = (struct AppMessage *) GetMsg (myport)) {
if (appmsg->am_NumArgs == 0) {
if (easyreq ("UnPacker v1.2, 93-09-22.\nCopyright ©1993 Erik Sagalara.\n",
"This program is FreeWare!", "QUIT!", "Continue"))
ok = FALSE;
}
else {
UBYTE i;
for (i=0; i<appmsg->am_NumArgs; i++)
handlefile (appmsg->am_ArgList[i].wa_Lock, appmsg->am_ArgList[i].wa_Name);
}
ReplyMsg ((struct Message *) appmsg);
}
}
RemoveAppIcon (appicon);
while (appmsg = (struct AppMessage *) GetMsg(myport))
ReplyMsg ((struct Message *) appmsg);
FreeDiskObject (diskobj);
DeleteMsgPort (myport);
cleanexit ("", 0);
}
////
// Process a tooltype assignment string (XYZ=123)
////
void handletool (char* instr, char* label, char* value)
{
UBYTE i, j, len;
len = strlen(instr);
for (i=0; (i<len) && (instr[i]!='='); i++) label[i] = toupper (instr[i]);
label[i] = '\0';
if (instr[i] != '=' && i >= len) {
value[0] = '\0';
}
else {
i++;
for (j=0; j+i<=len; j++) value[j] = instr[j+i];
value[j] = '\0';
}
}
////
// Process an archive file
////
void handlefile (BPTR lock, char* name)
{
UBYTE i, j;
BOOL found=FALSE;
char *buf1,* buf2, *method1, *method2, suffix[4]=" ";
for (i=strlen(name)-1; i>0 && (name[i] != '.'); i--);
if (name[i] != '.') goto err;
if (strlen (&name[i+1]) > 3) goto err;
for (j=0; suffix[j]!='\0'; j++) suffix[j] = toupper(name[i+j+1]);
for (i=0; i<NumItems && SuffixList[i]!=NULL; i++)
if (strcmp (suffix, SuffixList[i]) == 0) {
found = TRUE;
break;
}
if (!found) goto err;
method1 = strdup (MethodList[i]);
for (j=0; j<strlen(method1) && method1[j]!='?'; j++);
if (method1[j]=='?') {
if (strlen (method1) > j)
method2 = strdup (&method1[j+1]);
else
method2 = strdup ("");
method1[j] = '\0';
}
else
method2 = strdup ("");
buf2 = (char*) malloc (256);
NameFromLock (lock, buf2, 255);
AddPart (buf2, name, 255);
buf1 = (char*) malloc (strlen(method1) + strlen(buf2) + strlen(method2) + 40);
sprintf (buf1, "%s \"%s\" %s >CON:0/25/640/150/UnPacking.../CLOSE/AUTO/WAIT",
method1, buf2, method2);
CurrentDir (DestDir);
system (buf1);
free (buf1);
free (buf2);
free (method1);
free (method2);
return;
err: easyreq ("Unknown suffix for file:\n", name, OK, OK);
}
////
// Easy requester
////
int easyreq (char* bodystr, char* extra, char* yesstr, char* nostr)
{
static struct EasyStruct myES = {
sizeof(struct EasyStruct),
0,
"UnPacker requester:",
"%s%s",
"%s|%s",
};
return (EasyRequest(NULL, &myES, NULL, bodystr, extra, yesstr, nostr));
}
////
// Exits cleanly closing librarys and leaving a message
////
void cleanexit (char* exitstr, int stat)
{
UBYTE i;
if (stat)
if (stat == 20)
DisplayAlert(RECOVERY_ALERT, alertMsg, 52);
else
easyreq (exitstr, "", OK, OK);
for (i=0; i<NumItems; i++) {
if (SuffixList[i]) free (SuffixList[i]);
if (MethodList[i]) free (MethodList[i]);
}
if (DestDir) UnLock (DestDir);
if (OldDir) CurrentDir (OldDir);
if (IntuitionBase) CloseLibrary (IntuitionBase);
if (WorkbenchBase) CloseLibrary (WorkbenchBase);
if (IconBase) CloseLibrary (IconBase);
if (DosBase) CloseLibrary (DosBase);
exit (stat);
}